package douyin

import (
	"GoServer/utils/config"
	"GoServer/utils/debug"
	"GoServer/utils/tool"
	"encoding/json"
	"errors"
)

type StopTaskRequest struct {
	RoomId  string `json:"roomid"`
	AppId   string `json:"appid"`
	MsgType string `json:"msg_type"`
}

type StopTaskResponse struct {
	ErrNo  int      `json:"err_no"`
	ErrMsg string   `json:"err_msg"`
	LogId  string   `json:"logid"`
	Data   TaskData `json:"data"`
}

func StopLiveTask(roomId string, msgType string, gameName string) ([]byte, error) {
	defer func() {
		if r := recover(); !tool.InterfaceIsNil(r) {
			debug.Logln(debug.Warn, "StartLiveTask err", r)
			// 请求置顶礼物失败， 返回给客户端
		}
	}()

	debug.Logln(debug.Info, "开启直播弹幕事件监听, ", msgType)
	data := &StartTaskRequest{
		RoomId:  roomId,
		AppId:   config.GetConfig("app").GetString(gameName + ".appid"),
		MsgType: msgType,
	}

	reqBody, err := json.Marshal(data)
	if err != nil {
		// 监听事件失败， 返回给客户端
		return nil, errors.New("StopLiveTask httpPost err:" + err.Error())
	}
	jsonStr := string(reqBody)

	headers := map[string]string{
		"content-type": "application/json; charset=UTF-8",
		"access-token": GetDYAccessToken(gameName),
	}

	res, err := tool.SendPostOnceRetry(config.GetConfig("app").GetString("douyin.stopLiveData"), jsonStr, headers)
	if err != nil {
		// 监听事件失败， 返回给客户端
		return nil, errors.New("StopLiveTask1 httpPost err:" + err.Error())
	}
	msg := StopTaskResponse{}
	if err := json.Unmarshal(res, &msg); err != nil {
		debug.Logln(debug.Error, err)
	}
	if msg.ErrNo != 0 {
		// 监听事件失败， 返回给客户端
		// 40023	缺少必要的请求参数
		// 40022	无效的AccessToken
		// 10001	服务器内部错误
		errMsg := ""
		switch msg.ErrNo {
		case 40023: // 40023	缺少必要的请求参数
			errMsg = "缺少必要的请求参数"
		case 40022: // 40022	无效的AccessToken
			errMsg = "无效的AccessToken"
		case 10001: // 10001	服务器内部错误
			errMsg = "服务器内部错误"
		case 5003019: // 5003019	推送任务不符合开启的限制条件
			errMsg = "推送任务不符合开启的限制条件"
		default:
			errMsg = "未知错误"
		}
		return nil, errors.New("StartLiveTask httpPost err:" + errMsg)
	} else {
		// 开启直播间任务成功
		debug.Logf(debug.Info, "[roomid : %s][开启直播互动数据成功] : %s \n", roomId, msg)

		return res, nil
	}
}
